package com.ilxqx.framework.schedule.util;

import com.ilxqx.framework.amqp.po.SysTask;
import com.ilxqx.framework.amqp.service.MessageSenderService;
import com.ilxqx.framework.system.upload.enumeration.FileTypeEnum;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * Quartz定时计划任务工具类
 * @author venus
 */
@Slf4j
@Component
public final class ScheduleUtils {

    /**
     * 任务调度器
     */
    private static Scheduler scheduler;

    private static MessageSenderService messageSenderService;

    @Autowired
    public ScheduleUtils(Scheduler scheduler, MessageSenderService messageSenderService) {
        ScheduleUtils.scheduler = scheduler;
        ScheduleUtils.messageSenderService  = messageSenderService;
    }

    /**
     * 启动测试任务
     */
    public static void startTestJob() {
        try {
            ScheduleUtils.scheduler.scheduleJob(TriggerUtils.createTestJobTrigger("Venus"));
        } catch (SchedulerException e) {
            log.error("调用测试Job任务出现异常：{}", e);
        }
    }

    /**
     * 停止测试任务
     */
    public static void stopTestJob() {
        try {
            ScheduleUtils.scheduler.unscheduleJob(TriggerUtils.getTestJobTriggerKey("Venus"));
        } catch (SchedulerException e) {
            log.error("停止测试Job任务出现异常：{}", e);
        }
    }

    /**
     * 开启文件删除任务
     * @param key 文件唯一标识
     * @param fileTypeEnum 文件类型枚举
     */
    public static void startFileDeletionJob(String key, FileTypeEnum fileTypeEnum) {
        try {
            ScheduleUtils.scheduler.scheduleJob(TriggerUtils.createFileDeletionJobTrigger(key, fileTypeEnum));
        } catch (SchedulerException e) {
            log.error("添加文件删除Job任务出现异常：{}", e);
            // 出错后需要进行重试
            ScheduleUtils.messageSenderService.sendMessage("添加删除文件Job任务[" + key + "]", (SysTask) () -> {
                scheduler.scheduleJob(TriggerUtils.createFileDeletionJobTrigger(key, fileTypeEnum));
            });
        }
    }

    /**
     * 停止文件删除任务
     * @param key 文件唯一标识
     */
    public static void stopFileDeletionJob(String key) {
        try {
            ScheduleUtils.scheduler.unscheduleJob(TriggerUtils.getFileDeletionJobTrigger(key));
        } catch (SchedulerException e) {
            log.error("停止文件删除Job任务出现异常：{}", e);
            // 出错之后需要进行重试
            ScheduleUtils.messageSenderService.sendMessage("停止删除文件Job任务[" + key + "]", (SysTask) () -> {
                scheduler.unscheduleJob(TriggerUtils.getFileDeletionJobTrigger(key));
            });
        }
    }

}
